package org.origin.ferret.center.utils;

import org.origin.centre.support.utils.BasicUtil;
import org.origin.centre.utils.SpringUtil;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

/**
 * 系统用户工具
 *
 * @author ferret
 * @version 2024-05-08
 */
@SuppressWarnings("unused")
public final class UserUtil {

    /**
     * 刷新用户信息及权限
     */
    public static void refresh(UserDetails entity) {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        // 重新new一个token，因为Authentication中的权限是不可变的.
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(
                entity, authentication.getCredentials(), entity.getAuthorities());
        result.setDetails(authentication.getDetails());
        securityContext.setAuthentication(result);
    }

    /**
     * 获取机器标识（Machine ID）。优先级如下：
     * 1. 从配置中获取直接定义的machineId。
     * 2. 若未定义，则尝试使用spring.application.name作为机器ID。
     * 3. 若上述两者都未设置，则尝试使用server.name。
     * 4. 若所有配置均未提供，则返回一个默认的提示信息或生成一个临时标识。
     *
     * @return 机器标识字符串
     */
    public static String getMachineId() {
        String machineId = SpringUtil.getProperty("machineId");
        if (BasicUtil.isNotBlank(machineId)) {
            return machineId;
        }
        machineId = SpringUtil.getProperty("spring.application.name");
        if (BasicUtil.isNotBlank(machineId)) {
            return machineId;
        }
        machineId = SpringUtil.getProperty("server.name");
        if (BasicUtil.isNotBlank(machineId)) {
            return machineId;
        }

        // 如果所有配置项都没有提供有效的值，返回一个默认的提示或生成一个简单的唯一标识
        return "DEFAULT_MACHINE_ID";
    }
}
